package com.generics;

public class CustomerGenericClass {
    public static void main(String[] args) {
        //T,R,M 默认是Object类型
        Tiger<Double,String ,Integer> g =new Tiger<>("John");
        g.setT(10.9);
        //g.setT("yy");
        System.out.println(g);

        //默认是Object类型
        Tiger g2 = new Tiger("Adair");
        g2.setT("yy");//因为T=Object类型
        System.out.println("g2 = "+ g2);
    }
}


//1. Tiger 称为自定义泛型类
//2. T,R,M 泛型的标示符，一般是单个大写字母
//3. 泛型标示符可以有多个
//4. 普通成员可以使用泛型(属性、方法)
//5. 使用泛型的数组，不能初始化，类里的方法和属性 也不能使用static
class Tiger<T,R,M>{
    String name;
    //属性使用到泛型
    T t;
    R r;
    M m;
    //因为数组在new的时候，不能确定T的类型。就无法在内存开辟空间
    //T[] ts = new [5];
    //因为静态是和类相关的，在类加载时，对象还没有创建。
    //所以，如果静态方法和静态属性使用了泛型，JVM无法完成初始化。
    //static R r2;
    //构造器使用泛型

    public Tiger(String name) {
        this.name = name;

    }

    public Tiger( T t, R r, M m) {
        this.t = t;
        this.r = r;
        this.m = m;
    }

    public Tiger(String name, T t, R r, M m) {
        this.name = name;
        this.t = t;
        this.r = r;
        this.m = m;
    }

    //方法使用泛型
    public String getName() {
        return name;
    }

    public T getT() {
        return t;
    }

    public R getR() {
        return r;
    }

    public M getM() {
        return m;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setT(T t) {
        this.t = t;
    }

    public void setR(R r) {
        this.r = r;
    }

    public void setM(M m) {
        this.m = m;
    }

    @Override
    public String toString() {
        return "Tiger{" +
                "name='" + name + '\'' +
                ", t=" + t +
                ", r=" + r +
                ", m=" + m +
                '}';
    }
}